package ar.uba.fi.algo3.algoTank.pantallas;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collections;
import java.util.LinkedList;

import ar.uba.fi.algo3.algoTank.Juego;
import ar.uba.fi.algo3.algoTank.Objetos.Base;
import ar.uba.fi.algo3.algoTank.Objetos.Objeto;
import ar.uba.fi.algo3.algoTank.Objetos.Tanques.Tanque;
import ar.uba.fi.algo3.titiritero.ControladorJuego;

public class Persistencia {

	private ControladorJuego controlador;
	private Pantallas pantallas;
	private String nombreArchivoObjetos;
	private String nombreArchivoJuego;
	private String nombreArchivoPuntajes;
	
	public Persistencia(Pantallas pantallas, ControladorJuego controlador){
		this.pantallas = pantallas;
		this.controlador = controlador;
		this.nombreArchivoJuego = "Juego.dat";
		this.nombreArchivoObjetos = "Objetos.dat";
		this.nombreArchivoPuntajes = "Puntajes.dat";

	}
	
	
	public void guardarJuego() {
		
		LinkedList<Objeto> listaDeObjetos = new LinkedList<Objeto>();
		listaDeObjetos=	controlador.getJuego().getTerritorio().getObjetos();
	
		try {		
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(nombreArchivoJuego));
			oos.writeObject(controlador.getJuego());	
			
			ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(nombreArchivoObjetos));
			for (Objeto obj : listaDeObjetos)
				oos1.writeObject(obj);	

		} 
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void cargarJuego() {
		Juego juegoViejo = controlador.getJuego();
		controlador.clearDibujables();
		
		try {
			//primera etapa, recupero el juego y lo transformo en el actual
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(nombreArchivoJuego));
			Juego juego = (Juego) ois.readObject();
		
			
			juego.setTerritorio(juegoViejo.getTerritorio());
			juego.setCreadorDeFlotas(juegoViejo.getCreadorDeFlotas());
			juego.setCreadorDeItems(juegoViejo.getCreadorDeItems());
			juegoViejo.setFlota(juego.getFlota());
			
			
			
			controlador.setJuego(juego);
			

			
			//segunda etapa
			//limpio los objetos de territorio y agrego los del archivo
			juego.getTerritorio().deleteAllObjetos();
			
			//no se porq tengo que poner estas dos lineas aca si o si
			juego.getJugador().setTerritorio(juegoViejo.getTerritorio());
			juegoViejo.getTerritorio().addObjeto(juego.getJugador());
			
			juego.getBase().setTerritorio(juegoViejo.getTerritorio());
			juegoViejo.getTerritorio().addObjeto(juego.getBase());
			
			ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream(nombreArchivoObjetos));
			Objeto obj = null;
			
			
			for(Objeto tanque : juego.getFlota().getTanques()){
				tanque.setTerritorio(juegoViejo.getTerritorio());
				juegoViejo.getTerritorio().addObjeto(tanque);
			}
			
			try {
				while ( (obj = (Objeto) ois1.readObject()) != null) 	
				if( ( obj.getClass().getSuperclass() != Tanque.class) && ( obj.getClass().getSuperclass() != Base.class) ){
					obj.setTerritorio(juegoViejo.getTerritorio());
					juegoViejo.getTerritorio().addObjeto(obj);
				}
            }
			catch (EOFException e) {	
			}
			
			
			
			//tercera etapa reanuda el juego
			
			pantallas.cargarTextosDelJuego();
			pantallas.continuarJuego();
			
		}
		catch (FileNotFoundException e) {
			pantallas.cargarMenuSinPartidasGuardadas();
			e.printStackTrace();
		} 
		catch (IOException e) {
			e.printStackTrace();
		} 
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	
	public LinkedList<Integer> cargarPuntajes() throws FileNotFoundException {
		try {
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(nombreArchivoPuntajes));
			LinkedList<Integer> lista = (LinkedList<Integer>) ois.readObject();
			return lista;
		}
		catch (FileNotFoundException e) {
			throw(e);
		}
		catch (IOException e) {
			e.printStackTrace();
		} 	
		catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	
	public void guardarPuntaje() {
		LinkedList<Integer> lista = new LinkedList<Integer>();

		int puntos = controlador.getJuego().getJugador().getPuntos();
		try {
			lista = this.cargarPuntajes();
			lista.add(puntos);
			Collections.sort(lista);
			Collections.reverse(lista);
			if (lista.size()>5)
				lista.removeLast();
		}
		catch (FileNotFoundException e) {
			lista.add(puntos);
			Collections.sort(lista);
			Collections.reverse(lista);
		}

		try {
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(nombreArchivoPuntajes));
			oos.writeObject(lista);
		} 
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	
}
